void char2bin(unsigned char number, int bitarray[8]);
unsigned char bin2char(int bitarray[8]);
void encode(unsigned char number, int bitarray1[8], int bitarray2[8]);


void main()
{
    int *rs232_port = (int*)0xC00000;
    unsigned char number;
    int bitarray1[8];
    int bitarray2[8];
    unsigned char l;
    unsigned char k;
	unsigned char DLE=16;
	unsigned char ETX=17;
	unsigned char STX=18;
    int m;
    int j;
	int r = 0;
	

    unsigned char a[63] = {0,22,45,71,42,67,70,22,0,23,50,32,51,63,45,23,0,32,36,41,64,71,50,32,0,41,22,54,42,32,36,41,0,28,31,67,51,41,22,28,0,31,70,63,64,54,31,31,0,0,19,32,64,40,63,71,22,0,20,43,23,42,54};

    for(m = 0; m<9; m++)
    {

    encode(DLE,bitarray1,bitarray2);
    k = bin2char(bitarray1);
    l = bin2char(bitarray2);
    rs232_port[0] = k;
    printf("%c", &k);
    rs232_port[0] = l;
    printf("%c", &l);

    encode(STX,bitarray1,bitarray2);
    k = bin2char(bitarray1);
    l = bin2char(bitarray2);
    rs232_port[0] = k;
    printf("%c", &k);
    rs232_port[0] = l;
    printf("%c", &l);
	
	r = 7*m;
    
	for(j = r; j<r+7; j++)
    {
        number = a[j];
        encode(number, bitarray1, bitarray2);
        k = bin2char(bitarray1);
        l = bin2char(bitarray2);
        rs232_port[0] = k;
        printf("%c", &k);
        rs232_port[0] = l;
        printf("%c", &l);
    }

    encode(DLE,bitarray1,bitarray2);
    k = bin2char(bitarray1);
    l = bin2char(bitarray2);
    rs232_port[0] = k;
    printf("%c", &k);
    rs232_port[0] = l;
    printf("%c", &l);

    encode(ETX,bitarray1,bitarray2);
    k = bin2char(bitarray1);
    l = bin2char(bitarray2);
    rs232_port[0] = k;
    printf("%c", &k);
    rs232_port[0] = l;
    printf("%c", &l);

    }
}

unsigned char bin2char(int bitarray[8]) {
    unsigned char number = 0;
    int i;

    for(i=0; i<8; i++) {
        if(bitarray[i]!=0) {
            number += 1<<i;
        }
    }
    return number;
}
void char2bin(unsigned char number, int bitarray[8]) {
    int j;
    for (j=0; j<8; j++) {
        bitarray[j] = ((number >> j) & 1)==1?1:0;
    }
}
void encode(unsigned char number, int bitarray1[8], int bitarray2[8]) {
    //b3, b3^b2^b1, b2, !b2^b1^b0, b1, !b3^b1^b0, b0, !b3^b2^b0
    int bitarray[8];
    char2bin(number, bitarray);

    bitarray1[7] = (bitarray[3]);
    bitarray1[6] = ((bitarray[3])^(bitarray[2])^(bitarray[1]))==1?1:0;
    bitarray1[5] = (bitarray[2]);
    bitarray1[4] = ((!bitarray[2])^(bitarray[1])^(bitarray[0]))==1?1:0;
    bitarray1[3] = (bitarray[1]);
    bitarray1[2] = ((!bitarray[3])^(bitarray[1])^(bitarray[0]))==1?1:0;
    bitarray1[1] = (bitarray[0]);
    bitarray1[0] = ((!bitarray[3])^(bitarray[2])^(bitarray[0]))==1?1:0;

    bitarray2[7] = (bitarray[7]);
    bitarray2[6] = ((bitarray[7])^(bitarray[6])^(bitarray[5]))==1?1:0;
    bitarray2[5] = (bitarray[6]);
    bitarray2[4] = ((!bitarray[6])^(bitarray[5])^(bitarray[4]))==1?1:0;
    bitarray2[3] = (bitarray[5]);
    bitarray2[2] = ((!bitarray[7])^(bitarray[5])^(bitarray[4]))==1?1:0;
    bitarray2[1] = (bitarray[4]);
    bitarray2[0] = ((!bitarray[7])^(bitarray[6])^(bitarray[4]))==1?1:0;
}
